import Vue from 'vue'
import App from './src/App'
import store from './src/store'
import { checkLogin } from './src/utils/auth'

// 导入请求封装
import http from './src/utils/http'

// 导入全局样式
import './src/assets/styles/reset.css'
import './src/assets/styles/common.css'

Vue.config.productionTip = false

// 全局挂载请求方法
Vue.prototype.$http = http

// 全局路由拦截
const list = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
list.forEach(method => {
  uni.addInterceptor(method, {
    invoke(e) {
      // 对登录页面和首页的跳转不进行登录检查
      if (e.url.includes('/pages/login/index') || e.url.includes('/src/pages/index/index')) {
        return e
      }
      
      // 检查登录状态
      if (!checkLogin(e.url)) {
        return false
      }
      return e
    },
    fail(err) {
      console.error('路由跳转失败:', err)
    }
  })
})

// 全局错误处理
Vue.config.errorHandler = (err, vm, info) => {
  // 显示用户友好的错误提示
  uni.showToast({
    title: '程序出现异常，请重试',
    icon: 'none'
  })
}

// 跨平台的未捕获Promise错误处理
const handleUnhandledRejection = (reason) => {
  // 显示用户友好的错误提示
  uni.showToast({
    title: '操作失败，请稍后重试',
    icon: 'none'
  })
}

// 监听未处理的Promise错误
uni.onUnhandledRejection(handleUnhandledRejection)

// 根据平台添加全局错误监听
// #ifdef H5
if (typeof window !== 'undefined') {
  window.addEventListener('unhandledrejection', event => {
    handleUnhandledRejection(event.reason)
    event.preventDefault()
  })
}
// #endif

// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
// 小程序平台的错误处理
wx.onError && wx.onError((error) => {
  handleUnhandledRejection(error)
})

wx.onUnhandledRejection && wx.onUnhandledRejection((res) => {
  handleUnhandledRejection(res.reason)
})
// #endif

// #ifdef APP-PLUS
// App平台的错误处理
plus.runtime.isApplicationExist && plus.runtime.isApplicationExist({
  pname: plus.runtime.appid,
  extra: {
    onError: (error) => {
      handleUnhandledRejection(error)
    }
  }
})
// #endif

App.mpType = 'app'

const app = new Vue({
  store,
  ...App
})
app.$mount()    